package com.jinlei.crm.settings.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jinlei.crm.commons.exception.CustomException;
import com.jinlei.crm.commons.utils.DateUtil;
import com.jinlei.crm.commons.utils.MD5Util;
import com.jinlei.crm.commons.utils.UUIDUtil;
import com.jinlei.crm.settings.dao.UserDao;
import com.jinlei.crm.settings.entity.DicValue;
import com.jinlei.crm.settings.entity.User;
import com.jinlei.crm.settings.service.DicValueService;
import com.jinlei.crm.settings.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 用户表(User)表服务实现类
 *
 * @author makejava
 * @since 2022-06-27 15:42:15
 */
@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserDao userDao;

    @Autowired
    private DicValueService dicValueService;

    /**
     * 通过ID查询单条数据
     *
     * @param id 主键
     * @return 实例对象
     */
    @Override
    public User findById(String id) {
        return userDao.selectById(id);
    }
    /**
     *通过用户名(登录账户)查询单条数据
     *
     * @param loginAct 登录账户名
     * @return 返回结果
     */
    @Override
    public User findByLoginAct(String loginAct) {
        return userDao.selectByLoginAct(loginAct);
    }

    /**
     * 分页查询
     *
     * @param pageNumber 当前页码
     * @param pageSize   每页条数
     * @param user       筛选条件
     * @return 查询结果
     */
    @Override
    public Map<String, Object> listPage(Integer pageNumber, Integer pageSize, User user) {
        PageHelper.startPage(pageNumber, pageSize);
        PageInfo<User> pageInfo = new PageInfo<>(userDao.select(user));
        Map<String, Object> pageMap = new HashMap<>();
        pageMap.put("list", pageInfo.getList().stream().map(item -> {
            DicValue param  = new DicValue();
            param.setTypeCode("lockState");
            List<DicValue> dicValueList = dicValueService.list(param);
            DicValue dicValue = dicValueList.stream().filter(e -> e.getValue().equals(item.getLockState())).findFirst().get();
            item.setLockState(dicValue.getText());
            return item;
        }).collect(Collectors.toList()));
        pageMap.put("total", pageInfo.getTotal());
        return pageMap;
    }

    /**
     * 普通查询所有方法
     *
     * @return 返回用户列表
     */
    @Override
    public List<User> list() {
        return userDao.select(null);
    }

    /**
     * 新增数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public boolean insert(User user) {

        // 判断用户名是否重复
        User dbUser = userDao.selectByLoginAct(user.getLoginAct());
        if(dbUser != null){
            throw new CustomException(-2,"用户名已存在");
        }
        // 手动维护ID
        user.setId(UUIDUtil.getUUID(user.getId()));
        // 密码加密处理
        user.setLoginPwd(MD5Util.getMD5(user.getLoginPwd()));
        // 设置创建时间和修改时间
        user.setCreateTime(DateUtil.formatDate(new Date()));

        return userDao.insert(user) > 0;
    }

    /**
     * 修改数据
     *
     * @param user 实例对象
     * @return 实例对象
     */
    @Override
    public boolean update(User user) {
        user.setEditTime(DateUtil.formatDate(new Date()));
        return userDao.update(user) > 0;
    }

    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @Override
    public boolean remove(String id) {
        return userDao.deleteById(id) > 0;
    }

    /**
     * 通过主键批量删除数据
     *
     * @param ids 主键
     * @return 是否成功
     */
    @Override
    public boolean removeBatch(String[] ids) {
        return userDao.deleteBatch(ids) > 0;
    }
}
